Modification start date
[BattleCats.git] / Assets / Scripts / Imported / Tilemap / Tiles / Rule Override Tile / Scripts / RuleOverrideTile.cs
blob590ec328afd31b08ead5580351a5ba53ed662d8a
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using UnityEngine.Tilemaps;
6 namespace UnityEngine
8 [Serializable]
9 [CreateAssetMenu]
10 public class RuleOverrideTile : TileBase
12 [Serializable]
13 public class TileSpritePair
15 public Sprite m_OriginalSprite;
16 public Sprite m_OverrideSprite;
18 [Serializable]
19 public class OverrideTilingRule
21 public bool m_Enabled;
22 public RuleTile.TilingRule m_TilingRule = new RuleTile.TilingRule();
25 public Sprite this[Sprite originalSprite]
27 get
29 foreach (TileSpritePair spritePair in m_Sprites)
31 if (spritePair.m_OriginalSprite == originalSprite)
33 return spritePair.m_OverrideSprite;
36 return null;
38 set
40 if (value == null)
42 m_Sprites = m_Sprites.Where(spritePair => spritePair.m_OriginalSprite != originalSprite).ToList();
44 else
46 foreach (TileSpritePair spritePair in m_Sprites)
48 if (spritePair.m_OriginalSprite == originalSprite)
50 spritePair.m_OverrideSprite = value;
51 return;
54 m_Sprites.Add(new TileSpritePair()
56 m_OriginalSprite = originalSprite,
57 m_OverrideSprite = value,
58 });
62 public RuleTile.TilingRule this[RuleTile.TilingRule originalRule]
64 get
66 if (!m_Tile)
67 return null;
69 int index = m_Tile.m_TilingRules.IndexOf(originalRule);
70 if (index == -1)
71 return null;
72 if (m_OverrideTilingRules.Count < index + 1)
73 return null;
75 return m_OverrideTilingRules[index].m_Enabled ? m_OverrideTilingRules[index].m_TilingRule : null;
77 set
79 if (!m_Tile)
80 return;
82 int index = m_Tile.m_TilingRules.IndexOf(originalRule);
83 if (index == -1)
84 return;
86 if (value == null)
88 if (m_OverrideTilingRules.Count < index + 1)
89 return;
90 m_OverrideTilingRules[index].m_Enabled = false;
91 while (m_OverrideTilingRules.Count > 0 && !m_OverrideTilingRules[m_OverrideTilingRules.Count - 1].m_Enabled)
92 m_OverrideTilingRules.RemoveAt(m_OverrideTilingRules.Count - 1);
94 else
96 while (m_OverrideTilingRules.Count < index + 1)
97 m_OverrideTilingRules.Add(new OverrideTilingRule());
98 m_OverrideTilingRules[index].m_Enabled = true;
99 m_OverrideTilingRules[index].m_TilingRule = CloneTilingRule(value);
100 m_OverrideTilingRules[index].m_TilingRule.m_Neighbors = null;
105 public RuleTile m_Tile;
106 public bool m_Advanced;
107 public List<TileSpritePair> m_Sprites = new List<TileSpritePair>();
108 public List<OverrideTilingRule> m_OverrideTilingRules = new List<OverrideTilingRule>();
109 public OverrideTilingRule m_OverrideDefault = new OverrideTilingRule();
110 public RuleTile.TilingRule m_OriginalDefault
114 return new RuleTile.TilingRule()
116 m_Sprites = new Sprite[] { m_Tile != null ? m_Tile.m_DefaultSprite : null },
117 m_ColliderType = m_Tile != null ? m_Tile.m_DefaultColliderType : Tile.ColliderType.None,
122 private RuleTile m_RuntimeTile;
124 public override bool GetTileAnimationData(Vector3Int position, ITilemap tilemap, ref TileAnimationData tileAnimationData)
126 if (!m_RuntimeTile)
127 Override();
128 return m_RuntimeTile.GetTileAnimationData(position, tilemap, ref tileAnimationData);
130 public override void GetTileData(Vector3Int position, ITilemap tilemap, ref TileData tileData)
132 if (!m_RuntimeTile)
133 Override();
134 m_RuntimeTile.GetTileData(position, tilemap, ref tileData);
136 public override void RefreshTile(Vector3Int position, ITilemap tilemap)
138 if (!m_RuntimeTile)
139 Override();
140 m_RuntimeTile.RefreshTile(position, tilemap);
142 public override bool StartUp(Vector3Int position, ITilemap tilemap, GameObject go)
144 Override();
145 return m_RuntimeTile.StartUp(position, tilemap, go);
148 public void ApplyOverrides(IList<KeyValuePair<Sprite, Sprite>> overrides)
150 if (overrides == null)
151 throw new System.ArgumentNullException("overrides");
153 for (int i = 0; i < overrides.Count; i++)
154 this[overrides[i].Key] = overrides[i].Value;
156 public void GetOverrides(List<KeyValuePair<Sprite, Sprite>> overrides)
158 if (overrides == null)
159 throw new System.ArgumentNullException("overrides");
161 overrides.Clear();
163 if (!m_Tile)
164 return;
166 List<Sprite> originalSprites = new List<Sprite>();
168 if (m_Tile.m_DefaultSprite)
169 originalSprites.Add(m_Tile.m_DefaultSprite);
171 foreach (RuleTile.TilingRule rule in m_Tile.m_TilingRules)
172 foreach (Sprite sprite in rule.m_Sprites)
173 if (sprite && !originalSprites.Contains(sprite))
174 originalSprites.Add(sprite);
176 foreach (Sprite sprite in originalSprites)
177 overrides.Add(new KeyValuePair<Sprite, Sprite>(sprite, this[sprite]));
179 public void ApplyOverrides(IList<KeyValuePair<RuleTile.TilingRule, RuleTile.TilingRule>> overrides)
181 if (overrides == null)
182 throw new System.ArgumentNullException("overrides");
184 for (int i = 0; i < overrides.Count; i++)
185 this[overrides[i].Key] = overrides[i].Value;
187 public void GetOverrides(List<KeyValuePair<RuleTile.TilingRule, RuleTile.TilingRule>> overrides)
189 if (overrides == null)
190 throw new System.ArgumentNullException("overrides");
192 overrides.Clear();
194 if (!m_Tile)
195 return;
197 foreach (var originalRule in m_Tile.m_TilingRules)
199 RuleTile.TilingRule overrideRule = this[originalRule];
200 overrides.Add(new KeyValuePair<RuleTile.TilingRule, RuleTile.TilingRule>(originalRule, overrideRule));
202 overrides.Add(new KeyValuePair<RuleTile.TilingRule, RuleTile.TilingRule>(m_OriginalDefault, m_OverrideDefault.m_TilingRule));
205 public void Override()
207 m_RuntimeTile = m_Tile ? Instantiate(m_Tile) : new RuleTile();
208 m_RuntimeTile.m_Self = this;
209 if (!m_Advanced)
211 if (m_RuntimeTile.m_DefaultSprite)
212 m_RuntimeTile.m_DefaultSprite = this[m_RuntimeTile.m_DefaultSprite];
213 if (m_RuntimeTile.m_TilingRules != null)
214 foreach (RuleTile.TilingRule rule in m_RuntimeTile.m_TilingRules)
215 for (int i = 0; i < rule.m_Sprites.Length; i++)
216 if (rule.m_Sprites[i])
217 rule.m_Sprites[i] = this[rule.m_Sprites[i]];
219 else
221 if (m_OverrideDefault.m_Enabled)
223 m_RuntimeTile.m_DefaultSprite = m_OverrideDefault.m_TilingRule.m_Sprites.Length > 0 ? m_OverrideDefault.m_TilingRule.m_Sprites[0] : null;
224 m_RuntimeTile.m_DefaultColliderType = m_OverrideDefault.m_TilingRule.m_ColliderType;
226 if (m_RuntimeTile.m_TilingRules != null) {
227 for (int i = 0; i < m_RuntimeTile.m_TilingRules.Count; i++)
229 RuleTile.TilingRule originalRule = m_RuntimeTile.m_TilingRules[i];
230 RuleTile.TilingRule overrideRule = this[m_Tile.m_TilingRules[i]];
231 if (overrideRule == null)
232 continue;
233 CopyTilingRule(overrideRule, originalRule, false);
238 public RuleTile.TilingRule CloneTilingRule(RuleTile.TilingRule from)
240 var clone = new RuleTile.TilingRule();
241 CopyTilingRule(from, clone, true);
242 return clone;
244 public void CopyTilingRule(RuleTile.TilingRule from, RuleTile.TilingRule to, bool copyRule)
246 if (copyRule)
248 to.m_Neighbors = from.m_Neighbors;
249 to.m_RuleTransform = from.m_RuleTransform;
251 to.m_Sprites = from.m_Sprites.Clone() as Sprite[];
252 to.m_AnimationSpeed = from.m_AnimationSpeed;
253 to.m_PerlinScale = from.m_PerlinScale;
254 to.m_Output = from.m_Output;
255 to.m_ColliderType = from.m_ColliderType;
256 to.m_RandomTransform = from.m_RandomTransform;